import type { ApiRes } from '@/types/user'
import axios from 'axios'
import type { Method } from 'axios'
import { showFailToast } from 'vant'
import { useUserStore } from '@/stores'
import router from '@/router'
/*
vue-cli:
  环境变量：
     开发环境
        .env.development
        定义变量
            规则：VUE_APP_开头  如:VUE_APP_URL='值'
        访问：process.env.VUE_APP_URL
     生产环境
        .env.production
        定义变量
            规则：VUE_APP_开头  如:VUE_APP_URL='值'
        访问：process.env.VUE_APP_URL
vite
  环境变量
     开发环境
       .env.development
       定义变量
          规则：VITE_开头  如： VITE_APP_XXX='123'
          访问：import.meta.env.VITE_APP_XXX
     生产环境
       .env.production
       定义变量
          规则：VITE_开头  如： VITE_APP_XXX='123'
          访问：import.meta.env.VITE_APP_XXX

*/
const instance = axios.create({
  baseURL: import.meta.env.VITE_APP_URL
})
instance.interceptors.request.use(
  config => {
    const store = useUserStore()
    // 统一token
    if (store.userInfo?.token) {
      config.headers.Authorization = `Bearer ${store.userInfo.token}`
    }
    return config
  },
  err => {
    return Promise.reject(err)
  }
)
instance.interceptors.response.use(
  res => {
    if (res.data.code === 10000) {
      return res.data
    } else {
      showFailToast(res.data.message)
      return Promise.reject(new Error(res.data.message))
    }
  },
  err => {
    // token失效
    // 判断token失效条件  删除token   提示    跳转到登录页

    // console.dir(err)
    if (err.response && err.response.status === 401) {
      // 删除token
      const store = useUserStore()
      store.setUserInfo()
      showFailToast(err.response.data.message)
      // console.log(router)
      router.push('/login?redirect=' + router.currentRoute.value.fullPath)
    }

    return Promise.reject(err)
  }
)

function request<T> (url: string, method: Method = 'get', data: object = {}) {
  return instance<any, ApiRes<T>>({
    url: url,
    method: method,
    [method.toLowerCase() === 'get' ? 'params' : 'data']: data
  })
}
export default request
